package clases
{
	import conexion.Parser;
	import conexion.ResultInfoNro;
	
	import mx.collections.ArrayCollection;
	import mx.controls.Alert;
	import mx.rpc.AsyncToken;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	import mx.utils.ObjectUtil;
	import mx.utils.object_proxy;
	
	import services.multimedia.Multimedia;

	public class DataConection
	{
		private var config:Configuracion;
		
		public const HablaFacilDiario:int = 1;
		public const HablaFacilMensual:int = 2;
		public const HablaFacilAnual:int = 3;
		
		public const TACSAMensual:int = 2;
		public const TACSAAnual:int = 3;
		
		public function DataConection(configData:Configuracion) {
			config = configData;
			
			WSServices = new Multimedia();
			WSServices.wsdl = config.URLWebServices;
			WSServices.addEventListener(FaultEvent.FAULT, faultError);
			WSServices.addEventListener(ResultEvent.RESULT, wsResult);
		}
		
		private var WSServices:Multimedia;
		private var listaTokens:ArrayCollection = new ArrayCollection();
		
		public const GetMensajesValidos:String = "mensajesValidos";
		public const GetHablaFacil:String = "obtenerHablaFacilReproductor";
		public const GetTACSA:String = "obtenerTacsaReproductor";
		public const GetListaAccidentes:String = "listarAccidenteReproductor";
		public const GetListaCapacitaciones:String = "listarRolCapacitacionReproductor";
		public const GetReporteHablaFacil:String = "reporteHablaFacil";
		
		public function callServiceMethod(methodName:String, responseFunction:Function, params:Object = null):void{
			switch (methodName) {
				case GetMensajesValidos: 
					agregarToken(WSServices.getMensajesValidos(), GetMensajesValidos, responseFunction);
					break;
				case GetHablaFacil: 
					agregarToken(WSServices.obtenerHablaFacilReproductor(params.tipoHablaFacil), GetHablaFacil, responseFunction, params);
					break;
				case GetTACSA: 
					agregarToken(WSServices.obtenerTacsaReproductor(params.tipoTacsa), GetTACSA, responseFunction, params);
					break;
				case GetListaAccidentes: 
					agregarToken(WSServices.listarAccidenteReproductor(), GetListaAccidentes, responseFunction, params);
					break;
				case GetListaCapacitaciones: 
					agregarToken(WSServices.listarRolCapacitacionReproductor(), GetListaCapacitaciones, responseFunction, params);
					break;
				case GetReporteHablaFacil: 
					agregarToken(WSServices.reporteHablaFacil(), GetReporteHablaFacil, responseFunction, params);
					break;
			}
		}
	
		public function callGetHablaFacilDiario():void{
			//agregarToken(WSServices.getUltimasLecturasCourier(cantidad), GetHablaFacilDiario);
		}
		
		private function agregarToken(token:AsyncToken, tokenName:String, method:Function, params:Object = null, dataType:int = 0, resultType:int = 1):void{
			var objTok:Object = new Object();
			objTok.token = token;
			objTok.name = tokenName;
			objTok.params = params;
			objTok.dataType = dataType;
			objTok.resultType = resultType;
			objTok.method = method;
			
			listaTokens.addItem(objTok);
		}
		
		public function wsResult(e:ResultEvent):void{
			
			for each(var objTok:Object in listaTokens){
				if(e.token == objTok.token){
					if(objTok.resultType == 1){
						if(!validarResultInfo(e.result, objTok.name)){
							listaTokens.removeItemAt(listaTokens.getItemIndex(objTok));
							return;
						}
					}
					
					switch(objTok.name){
						case GetMensajesValidos: 
							objTok.method(Parser.parserMensajes(e.result.getMensajesValidosResult));
							break;
						
						case GetHablaFacil: 
							objTok.method(Parser.parserHablaFacil(e.result.obtenerHablaFacilReproductorResult));
							break;
						
						case GetTACSA: 
							objTok.method(Parser.parserTacsa(e.result.obtenerTacsaReproductorResult));
							break;
						
						case GetListaAccidentes: 
							objTok.method(Parser.parserAccidentes(e.result.listarAccidenteReproductorResult));
							break;
						
						case GetListaCapacitaciones: 
							objTok.method(Parser.parserCapacitaciones(e.result.listarRolCapacitacionReproductorResult));
							break;
						
						case GetReporteHablaFacil: 
							objTok.method(Parser.parserReporteHablaFacil(e.result.reporteHablaFacilResult));
							break;
					}
					listaTokens.removeItemAt(listaTokens.getItemIndex(objTok));
					return;
				} 
			}
		}
		
		private function faultError(e:FaultEvent):void{
			//removeBusyCursor();
			//
			if(config.debugMode){
				Alert.show("Error de conexión");
				Alert.show(String(e.fault));
				Alert.show(config.URLWebServices);
			}
			
			for each(var objTok:Object in listaTokens){
				if(e.token == objTok.token){
					switch(objTok.name){
						case GetHablaFacil: 
							//buscarHablaFacilDiario();
							break;
					}
					listaTokens.removeItemAt(listaTokens.getItemIndex(objTok));
					return;
				} 
			}
		}
		
		private function validarResultInfo(result:Object, method:String):Boolean{
			if(config.debugMode){
				Alert.show(ObjectUtil.toString(Object(result)));
			}
			
			if (result.resultado) {
				return true;
			} else {
				Alert.show(method + "\n\n" + result.error);
			}
			/*
			//Alert.show(result.ResultInfo); 
			switch(result.ResultInfo){
				case ResultInfoNro.OK: return true; break;
				//case ResultInfo.Warning: return true; mostrarWarning(result.ErrorMessage);  break;
				
				//case ResultInfo.ErrorLectura: mostrarError(result.ErrorMessage); break;
				//case ResultInfo.ErrorValidacion: mostrarError(result.ErrorMessage); break;
				case ResultInfoNro.ErrorConexionDB: Alert.show("Error de conexión a la Base de Datos"); break;
				//case ResultInfo.ErrorActiveDirectory: mostrarError(result.ErrorMessage); break;
			}		*/
			return false;
		}
	}
}